<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Validation\ValidationException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

use App\Http\ErrCode;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that should not be reported.
     *
     * @var array
     */
    protected $dontReport = [
        AuthorizationException::class,
        HttpException::class,
        ModelNotFoundException::class,
        ValidationException::class,
    ];

    /**
     * Report or log an exception.
     *
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
     *
     * @param  \Exception  $e
     * @return void
     */
    public function report(Exception $e)
    {
        parent::report($e);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        //wantsJson判断请求header上Accept的值是否是application/json
        if($request->wantsJson()){
            //如果是数据库错误,返回500错误的json格式
            if($e instanceof \Illuminate\Database\QueryException || $e instanceof \ErrorException){
                return response()
                    ->json(json_error(ErrCode::SERVER_INTERNAL_ERROR,$e->getMessage()),500);
            }
            //如果是model未找到,返回404错误的json格式
            elseif($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException){
                return response()
                    ->json(json_error(ErrCode::RESOURCE_NOT_FOUND,$e->getMessage()),404);
            }
            //其他HTTP状态错误
            elseif($e instanceof \Illuminate\Http\Exception\HttpResponseException){
                return response()
                    ->json(json_error(ErrCode::HTTP_RESPONSE_ERROR,$e->getResponse()->getContent()),$e->getResponse()->getStatusCode());
            }
            //其他错误
            else{
                // return response()
                //     ->json(json_error(ErrCode::HTTP_RESPONSE_ERROR,$e->getMessage()),500);
            }
        }
        return parent::render($request, $e);
    }
}
